﻿/********************************************************************************
** @ Date:2025/04/21
** @ Author: Gaojia
** @ Description: 设备管理业务类，创建设备，创建设备菜单，响应设备菜单
** @ Version:1.0.0
** @ Fun:
********************************************************************************/
#ifndef CDeviceManager_H
#define CDeviceManager_H

#include <QObject>
#include <QMenu>
#include <QLibrary>
#include "IDevice.h"
#include "CBaseDevice.h"
struct LoadedLibrary
{
	QString dllPath;                               // DLL 文件的路径
	QLibrary* library;                             // DLL 的库对象，便于卸载
	typedef IDevice* (*CreateDeviceFunc)(SDeviceConfig *pDeviceConfig);        // 创建设备实例的函数指针类型
	typedef QVector<IDevice*>* (*CreateDevicesFunc)(SDeviceConfig* pDeviceConfig); // 批量创建设备实例的函数指针类型
	typedef void(*DestroyDeviceFunc)(IDevice*);    // 销毁设备实例的函数指针类型
	typedef QVector<QString>*(*GetModelListFunc)(); // 获取设备模型列表的函数指针类型

	CreateDeviceFunc createFunc;                   // 用于创建设备的函数指针
	CreateDevicesFunc createFuncs;                 // 用于批量创建设备的函数指针
	DestroyDeviceFunc destroyFunc;                 // 用于销毁设备的函数指针
	GetModelListFunc getModelListFunc;             // 用于获取设备支持的模型列表的函数指针

	QVector<QString> modelList;                    // 设备支持的模型列表（如果有）
};

class CDeviceManager : public QObject {
	Q_OBJECT

public:
	explicit CDeviceManager(QObject* parent = nullptr);
	CBaseDevice * getDevice(QString sName, QString sId, QString sConfig, QObject* parent = nullptr);
	QVector<CBaseDevice*> createDevices(QString sName, QString sConfig, QObject* parent = nullptr);
	QMenu* createDeviceMenu(CBaseDevice* device, QWidget* parent);
	QVector<QString> getDllListFromPath();
	QVector<QString> getModelList(QString sDllName);

private:

	// 加载 DLL 并缓存其 create/destroy 函数
	bool loadLibrary(const QString& dllPath);
	// nType 0从配置文件创建设备实例 1击添加设备 创建设备实例
	IDevice* createDeviceInstance(CBaseDevice* pDevice);

	QVector<CBaseDevice*> createDevicesInstance(QString sName, QString sConfig, QObject* parent = nullptr);

	//设置CBaseDevice的IDevice对象
	void setBaseDevice(CBaseDevice* pBaseDevice, IDevice* pDevice);

	// 销毁单个设备实例
	bool destroyDeviceInstance(IDevice* device);

	// 卸载某 DLL 创建的所有设备
	void destroyDevicesByDll(const QString& dllName);

	// 卸载所有设备和 DLL
	void unloadAllDevices();

	//读取dll和dll名称配置文件
	bool loadConfig();

	//设置卡片样式
	void setCardQss(QVector<QWidget *>vecWidget);
	
private slots:
	void onRunDevice();
	void onStopDevice();
	void onRenameDevice();
	void onEnableAlarm();

private:
	CBaseDevice* currentDevice;
	QMap<QString,QMap<int, QString>>m_mapTypeName;
	QMap<QString, LoadedLibrary> m_mapDll;  
};
#endif